// -------请求库 Axios 二次封装   ------配置请求拦截器
/**
 * 1、【请求库的封装在一个前后端分离的项目中尤为关键，
 * 为什么这么说呢？api 可以统一管理，不管接口数量增加多少，
 * 所有的接口都可以统一经过一个地方做处理，逻辑会比较清晰。
 * 当项目小且接口数不多的情况下，直接使用 axios 在页面里请求，问题不大。
 * 但一旦页面多了，接口多了，问题就被无限放大，错误的返回，
 * 接口的维护都变得不可控。 】
 * 2、首先要安装 axios：npm install axios -S
 */

import axios from 'axios'
import { Toast } from 'vant'//vant提示组件
import router from '../router'
//1、
axios.defaults.baseURL = process.env.NODE_ENV == 'development' ? 'http://backend-api-01.newbee.ltd/api/v1' : 'http://backend-api-01.newbee.ltd/api/v1'
// axios.defaults.baseURL = process.env.NODE_ENV == 'development' ? '//47.99.134.126:28019/api/v1' : '//47.99.134.126:28019/api/v1'
//2、跨域请求是要不要携带cookie，本项目没有跨域请求的情况
axios.defaults.withCredentials = true
axios.defaults.headers['X-Requested-With'] = 'XMLHttpRequest'
//3、 判断用户登录状态是通过 token 来实现
//    登录成功后的 token 值存储到 localStorage 对象中，
axios.defaults.headers['token'] = localStorage.getItem('token') || ''
//4、 post 请求时，发送 json 形式的数据包
axios.defaults.headers.post['Content-Type'] = 'application/json'


//5、 interceptors 是拦截器，每个请求都会经过这个拦截器，// 添加请求拦截器
// 返回的数据可以通过拦截处理后返回
axios.interceptors.response.use(res => {
  if (typeof res.data !== 'object') {
    Toast.fail('服务端异常！')
    return Promise.reject(res)
  }
  // 6、我们在未登录的情况下获取用户信息数据，
  // 会提示“未登录”，接口的错误码为 416，
  // 用户未登录时返回的错误码统一为 416，
  // 这是与后端进行约定的。
  // 所以我们之前在二次封装 axios 请求库的时候，已经做了如下处理：

  if (res.data.resultCode != 200) {
    if (res.data.message) Toast.fail(res.data.message)
    if (res.data.resultCode == 416) {
      //7、 返回 416 代表没有登录状态，路由跳转到/login 页面

      router.push({ path: '/login' })
    }
    // 对响应错误做点什么
    return Promise.reject(res.data)
  }

  return res.data
})

export default axios
